﻿#ifndef FOCUSMEASURE_H
#define FOCUSMEASURE_H
#include "qtOpenCV/convert.h"
#include "opencv2/opencv.hpp"

static double roberts(cv::Mat &grayImage);
static double sobel(cv::Mat &grayImage);
static double laplace(cv::Mat &grayImage);
static double fastRoberts(cv::Mat &grayImage);
static double fastSobel(cv::Mat &grayImage);
static double fastLaplace(cv::Mat &grayImage);
static double discreteVariance(cv::Mat &grayImage);

class FocusMeasure
{
public:
    FocusMeasure();
    ~FocusMeasure();
    enum MeasureMethod{ROBERTS, FAST_ROBERTS, SOBEL, FAST_SOBEL, LAPLACE, FAST_LAPLACE, DISCRETE_VARIANCE};
    /**
     * @brief setMeasureMethod 设置采用何种判据评价一副图像的清晰程度，默认是 ROBERTS 算子计算梯度
     * @param method
     */
    void setMeasureMethod(MeasureMethod method);
    /**
     * @brief preprocess 对原始图像进行预处理。将彩色图像变成灰度图像，缩小图像尺寸等操作。
     * @param image 原始的图像
     * @return 输出图像为灰度图像，openCV 格式。以便进一步计算。
     */
    cv::Mat preprocess(QImage &image);
    /**
     * @brief measure 评价一副图像的清晰程度，输入只能为灰度图像。
     * @param grayImage
     * @return 输出结果越大表明图像约清晰
     */
    double measure(cv::Mat &grayImage)
    {
        return m_measureFunc(grayImage);
    }

    /**
     * @brief setZoomFactor 设置 preprocess 时图像的缩放系数
     * @param factor 0 和 1 表示不缩放，n 表示缩放为 1/n 大小
     */
    void setZoomFactor(int factor)
    {
        m_zoomFactor = factor;
    }
private:
    double (*m_measureFunc)(cv::Mat &);
    int m_zoomFactor;
};

#endif // FOCUSMEASURE_H
